package com.gmail.blackdog1987.carcare.util;

import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.UUID;

import org.json.JSONException;
import org.json.JSONObject;

import android.content.Context;
import android.content.SharedPreferences;
import android.os.Build;
import android.provider.Settings.Secure;
import android.telephony.TelephonyManager;
import android.text.TextUtils;

/**
 * 
 * @author 董国超
 *
 */
public class DeviceUtils {

	/**
	 * 操作系统。
	 */
	public static class OS {

		private static final String NAME = "ANDROID"; // 操作系统名称
		private static final String VERSION_RELEASE = Build.VERSION.RELEASE; // 操作系统版本
		private static final int VERSION_SDK = Build.VERSION.SDK_INT; // API Level

		/**
		 * 获取操作系统名称。
		 * 
		 * @return 操作系统名称。
		 */
		public static String getName() {
			return NAME;
		}

		/**
		 * 获取操作系统版本号。
		 * 
		 * @return 操作系统版本号。
		 */
		public static String getVersionRelease() {
			return VERSION_RELEASE;
		}

		/**
		 * 获取操作系统SDK号。
		 * 
		 * @return 操作系统SDK号。
		 */
		public static int getSDK() {
			return VERSION_SDK;
		}

		/**
		 * 获取JSON格式操作系统信息。
		 * 
		 * @return JSON格式操作系统信息
		 */
		public static String getJSON() {
			JSONObject json = new JSONObject();
			try {
				json.put("NAME", NAME);
				json.put("VERSION_RELEASE", VERSION_RELEASE);
				json.put("VERSION_SDK", VERSION_SDK);
			} catch (JSONException e) {
				e.printStackTrace();
				json = null;
			}
			return json == null ? "" : json.toString();
		}
	}

	/**
	 * 设备。
	 */
	public static class Device {

		public static final String MANUFACTURER = Build.MANUFACTURER; // 设备生产厂家
		public static final String MODEL = Build.MODEL; // 设备型号

		/**
		 * 获取设备生产厂家。
		 * 
		 * @return 设备生产厂家。
		 */
		public static final String getManufacturer() {
			return MANUFACTURER;
		}

		/**
		 * 获取设备型号。
		 * 
		 * @return 设备型号。
		 */
		public static final String getModel() {
			return MODEL;
		}

		/**
		 * 获取电话类型。
		 * 
		 * @param context 上下文
		 * @return 电话类型。<br/>
		 *         {@link android.telephony.TelephonyManager#PHONE_TYPE_NONE TelephonyManager.PHONE_TYPE_NONE} ： 无通话模块（如平板、电视等）<br/>
		 *         {@link android.telephony.TelephonyManager#PHONE_TYPE_GSM TelephonyManager.PHONE_TYPE_GSM} ： GSM电话<br/>
		 *         {@link android.telephony.TelephonyManager#PHONE_TYPE_CDMA TelephonyManager.PHONE_TYPE_CDMA} ： CDMA电话<br/>
		 *         {@link android.telephony.TelephonyManager#PHONE_TYPE_SIP TelephonyManager.PHONE_TYPE_SIP} ： SIP网络电话
		 */
		public static int getPhoneType(Context context) {
			int phoneType = TelephonyManager.PHONE_TYPE_NONE;
			try {
				TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
				phoneType = telMgr.getPhoneType();
			} catch (Exception e) {
				e.printStackTrace();
				phoneType = TelephonyManager.PHONE_TYPE_NONE;
			}
			return phoneType;
		}

		/**
		 * 获取android ID。
		 * 
		 * @param context 上下文
		 * @return android ID。
		 */
		public static String getAndroidId(Context context) {
			String androidId = "";
			try {
				androidId = Secure.getString(context.getContentResolver(), Secure.ANDROID_ID);
			} catch (Exception e) {
				e.printStackTrace();
				androidId = "";
			}
			return androidId;
		}

		/**
		 * 获取设备ID。
		 * 
		 * @param context 上下文。
		 * @return GSM电话返回IMEI，CDMA电话返回MEID，否则返回空字符串。
		 */
		public static String getDeviceId(Context context) {
			String deviceId = "";
			try {
				TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
				deviceId = telMgr.getDeviceId();
			} catch (Exception e) {
				e.printStackTrace();
				deviceId = "";
			}
			return deviceId;
		}

		/**
		 * 获取设备唯一ID，以“android ID”、“device ID”、“备选UUID”顺序，获取最先有效的一个，作为设备唯一识别标记。
		 * 
		 * @return 设备唯一ID。
		 */
		public static String getUniqueId(Context context) {
			String uniqueId = getAndroidId(context);
			if (!TextUtils.isEmpty(uniqueId) || "9774d56d682e549c".equals(uniqueId)) { // 在2.2版本，部分主流厂商生产的设备上，有一个很经常的bug，每个设备都会产生相同的ANDROID_ID：9774d56d682e549c
				return "ANDROID_ID:" + uniqueId;
			} else {
				uniqueId = getDeviceId(context);
			}
			if (!TextUtils.isEmpty(uniqueId)) {
				return "DEVICE_ID:" + uniqueId;
			} else {
				uniqueId = getUuid(context);
			}
			return "UUID:" + uniqueId;
		}

		/**
		 * 获取UUID，作为getUniqueId(Context)的替换方案。
		 * 
		 * @param context 上下文。
		 * @return UUID字符串。
		 */
		private static String getUuid(Context context) {
			String uuid = null;
			SharedPreferences pre = context.getSharedPreferences("DEVICE", Context.MODE_PRIVATE);
			uuid = pre.getString("UUID", "");
			if (TextUtils.isEmpty(uuid)) {
				uuid = UUID.randomUUID().toString().toLowerCase(Locale.getDefault());
				SharedPreferences.Editor editor = pre.edit();
				editor.putString("UUID", uuid);
				editor.commit();
			}
			return uuid;
		}
	}

	/**
	 * 电话卡。
	 */
	public static class PhoneCard {

		/** 运营商未知 */
		public static final int OPERATORS_UNKNOW = 0;
		/** 中国移动 */
		public static final int OPERATORS_CHINA_MOBILE = 1;
		/** 中国联通 */
		public static final int OPERATORS_CHINA_UNICOM = 2;
		/** 中国电信 */
		public static final int OPERATORS_CHINA_TELCOM = 3;

		private static final Map<String, Integer> OPERATORS_MAP; // 运营商MAP
		static {
			OPERATORS_MAP = new HashMap<String, Integer>();
			// 460036831376908 截取 460【03】6831376908 // 460表示中国
			OPERATORS_MAP.put("46000", OPERATORS_CHINA_MOBILE);
			OPERATORS_MAP.put("46001", OPERATORS_CHINA_UNICOM);
			OPERATORS_MAP.put("46002", OPERATORS_CHINA_MOBILE);
			OPERATORS_MAP.put("46003", OPERATORS_CHINA_TELCOM);
			OPERATORS_MAP.put("46007", OPERATORS_CHINA_MOBILE);
		}

		/**
		 * 获取运营商。
		 * 
		 * @return 运营商。<br/>
		 *         {@link #OPERATORS_UNKNOW}<br/>
		 *         {@link #OPERATORS_CHINA_MOBILE}<br/>
		 *         {@link #OPERATORS_CHINA_UNICOM}<br/>
		 *         {@link #OPERATORS_CHINA_TELCOM}
		 */
		public static int getOperators(Context context) {
			int operators = OPERATORS_UNKNOW;

			String imsi = getIMSI(context);
			if (!TextUtils.isEmpty(imsi) && imsi.length() >= 5) {
				String imsiPrex = imsi.substring(0, 5);
				operators = OPERATORS_MAP.get(imsiPrex) != null ? OPERATORS_MAP.get(imsiPrex) : OPERATORS_UNKNOW;
			}

			return operators;
		}

		/**
		 * 获取电话卡串号。
		 * 
		 * @return CDMA电话返回UIM，GSM电话返回SIM，否则返回空字符串。
		 */
		public static String getSimSerialNumber(Context context) {
			String serialNumber = "";
			try {
				TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
				serialNumber = telMgr.getSimSerialNumber();
			} catch (Exception e) {
				e.printStackTrace();
				serialNumber = "";
			}
			return serialNumber;
		}

		/**
		 * 获取IMSI（国际移动用户识别码）。
		 * 
		 * @return 成功返回IMSI，否则返回空字符串。
		 */
		public static String getIMSI(Context context) {
			String imsi = "";
			try {
				TelephonyManager telMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
				imsi = telMgr.getSubscriberId();
			} catch (Exception e) {
				e.printStackTrace();
				imsi = "";
			}
			return imsi;
		}
	}

}
